package cn.itcast.dao;


import cn.itcast.domain.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.expression.EvaluationException;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/*springdatajpa的Dao层接口规范
*    接口 JpaRepossitory<操作的实体类型,实体中主键属性的类型  提供一般的查询方法>
*     接口 JpaSpecificationExecutor<Customer>   提供一些高级的查询*/
public interface CustomerDao extends JpaRepository<Customer,Long>, JpaSpecificationExecutor<Customer> {


    //方法都不用写了  JpaRepository类帮我们写好了  直接调用就可以了

    /*真正发挥作用的是  接口的实现类
    * 动态代理 生成接口的实现类对象*/




    /*自定义一个查询方法  使用jpql
    * jpql: from Customer where custName=? */

    @Query(value="from Customer where custName= ?")
    public Customer findjpql(String custName);



    /*跟新  跟新和删除操作需要事务的支持  默认回滚  所以要设置不回滚*/
    @Transactional
    @Rollback(value=false)
    @Query(value="update Customer  set  custName= ?2 where custId=?1")
    @Modifying
    public void update1(long id,String name);



    /* 使用sql 查询
    * nativeQuery=true 本地查询    nativeQuery=false  jpql查询*/

    @Query(value="select * from  customer",nativeQuery=true)
    public List<Customer> find2();




    /*方法名约定查询
    * findByCustName         对象中的属性名首字母大写
    *
    * findByCustNameLike     模糊查询   */




    //基于JpaSpecificationExecutor 接口的高级查询


}
